home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 2002 February / MACPOWER-2002-02.ISO.7z / MACPOWER-2002-02.ISO / MacPowerオリジナル⁄連載 / P.260⁄ぷろれぼX / VJ Core.c < prev    next >
C/C++ Source or Header  |  2001-11-03  |  24KB  |  747 lines

  1. //---------------------------------------------------------------------
  2. //
  3. //        VJ システム コアプログラム
  4. //
  5. //---------------------------------------------------------------------
  6.  
  7. #include <Carbon.h>
  8. #include "VJ Core.h"
  9.  
  10. //---------------------------------------------------------------------
  11. //ウィンドウ表示ポート(どこからも参照できるようにグローバル定義)
  12. //---------------------------------------------------------------------
  13. WindowRef    mainWindow;
  14. DialogRef        ctrlDialog;
  15.  
  16. //---------------------------------------------------------------------
  17. //読み込んだPICTリソース情報
  18. //---------------------------------------------------------------------
  19. PicHandle        bgPictData;
  20. PicHandle        previewA_PicData;
  21. PicHandle        previewB_PicData;
  22.  
  23. //---------------------------------------------------------------------
  24. //3つのオフスクリーン用情報
  25. //---------------------------------------------------------------------
  26. //作成・破棄時に使用、オフスクリーン全体を指す
  27. GWorldPtr        previewA_GWorld;
  28. GWorldPtr        previewB_GWorld;
  29. GWorldPtr        previewC_GWorld;
  30. //イメージデータそのものの先頭位置を指す
  31. Ptr            previewA_BaseAddr;
  32. Ptr            previewB_BaseAddr;
  33. Ptr            previewC_BaseAddr;
  34. //イメージデータそのものの横幅を指す
  35. long            previewA_RowBytes;
  36. long            previewB_RowBytes;
  37. long            previewC_RowBytes;
  38. //---------------------------------------------------------------------
  39.  
  40. //動 作フ ラ グ用(現 在 は、A->B効 果中にfalse、B->A効 果 中にtrue)
  41. Boolean        timerFlip = false;
  42. Boolean        switchView = true;
  43.  
  44. //第6回 「スクロール効果による画像切り替え」(RollImage関数使用)用パラメータ
  45. //スクロール水平位置
  46. short        rollImageOffset = CENTER_PREVIEW_H;
  47. //スクロール速度(必ずCENTER_PREVIEW_Hの約数で)
  48. #define        ROLLSPEED        8
  49.  
  50. //左右の画像の合成度
  51. short        mixLevel = 10;
  52. //変化速度
  53. #define        MIXSPEED        10
  54.  
  55. //エフェクトの種類
  56. short        effectNo = 0;
  57.  
  58. //---------------------------------------------------------------------
  59. //
  60. //        プログラムメイン(ここからスタート)
  61. //
  62. //---------------------------------------------------------------------
  63. void main()
  64. {
  65.     Rect                bounds = { 0, 0, SCREEN_SIZE_V, SCREEN_SIZE_H };
  66.     Rect                screenRect;
  67.     OSStatus            err;
  68.     EventHandlerUPP    myWinEvtHandler;
  69.     EventHandlerRef    ref;
  70.     EventTypeSpec    list[] = { {kEventClassWindow, kEventWindowClose },
  71.                                { kEventClassWindow, kEventWindowDrawContent } ,
  72.                                { kEventClassMouse , kEventMouseDown } ,
  73.                                { kEventClassKeyboard , kEventRawKeyDown } };
  74.     EventLoopTimerRef    loopTimerRef;
  75.     //イメージの詳細情報が格納されたデータ位置を指す
  76.     PixMapHandle        previewA_PixMap;
  77.     PixMapHandle        previewB_PixMap;
  78.     PixMapHandle        previewC_PixMap;
  79.  
  80.     //カーソルの初期化
  81.     InitCursor();
  82.     //メニューの組み込み
  83.     err = InstallStandardMenuBar();
  84.     if (err != noErr) ExitToShell();
  85.     //アップルイベントの組み込み
  86.      err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(QuitAppleEventHandler), 0, FALSE);
  87.     if (err != noErr) ExitToShell();
  88.     //アプリケーションイベントハンドラーの組み込み
  89.     InstallAppEvents();
  90.     //画像の読み込み
  91.     LoadPictures();
  92.     //ウィンドウの作成
  93.     err = CreateNewWindow(kDocumentWindowClass,
  94.                   kWindowCloseBoxAttribute | kWindowStandardHandlerAttribute,
  95.                   &bounds, &mainWindow);
  96.     if (err != noErr) ExitToShell();
  97.  
  98.  
  99.     //表示画面を取得
  100.     GetWindowGreatestAreaDevice(mainWindow,NULL,NULL,&screenRect);
  101.     //3つのオフスクリーンを作成し各種情報を取得する
  102.     previewA_GWorld = CreateOffscreen(VJPICT_SIZE_H,VJPICT_SIZE_V);
  103.     previewA_PixMap = GetGWorldPixMap(previewA_GWorld);
  104.     previewA_BaseAddr = GetPixBaseAddr(previewA_PixMap);
  105.     previewA_RowBytes = GetPixRowBytes(previewA_PixMap);
  106.  
  107.     previewB_GWorld = CreateOffscreen(VJPICT_SIZE_H,VJPICT_SIZE_V);
  108.     previewB_PixMap = GetGWorldPixMap(previewB_GWorld);
  109.     previewB_BaseAddr = GetPixBaseAddr(previewB_PixMap);
  110.     previewB_RowBytes = GetPixRowBytes(previewB_PixMap);
  111.  
  112.     previewC_GWorld = CreateOffscreen(VJPICT_SIZE_H,VJPICT_SIZE_V);
  113.     previewC_PixMap = GetGWorldPixMap(previewC_GWorld);
  114.     previewC_BaseAddr = GetPixBaseAddr(previewC_PixMap);
  115.     previewC_RowBytes = GetPixRowBytes(previewC_PixMap);
  116.     //各オフスクリーンを白で初期化
  117.     FillImage(previewA_BaseAddr,previewA_RowBytes,VJPICT_SIZE_H,VJPICT_SIZE_V,0x00ffffff);
  118.     FillImage(previewB_BaseAddr,previewB_RowBytes,VJPICT_SIZE_H,VJPICT_SIZE_V,0x00ffffff);
  119.     FillImage(previewC_BaseAddr,previewC_RowBytes,VJPICT_SIZE_H,VJPICT_SIZE_V,0x00ffffff);
  120.  
  121.     //イベントハンドラの取得
  122.     myWinEvtHandler = NewEventHandlerUPP(MyWindowEventHandler);
  123.     //イベントハンドラの組み込み
  124.     InstallWindowEventHandler(mainWindow, myWinEvtHandler, 4 , list, 0, &ref);
  125.  
  126.     //ループタイマーの起動
  127.     InstallEventLoopTimer(GetCurrentEventLoop(),0,0.05,NewEventLoopTimerUPP(MyTimerRoutine),NULL,&loopTimerRef);
  128.     //ウィンドウを画面中央に配置
  129.     MoveWindowStructure(mainWindow,(screenRect.right-screenRect.left)/2-SCREEN_SIZE_H/2,(screenRect.bottom-screenRect.top)/2-SCREEN_SIZE_V/2);
  130.  
  131.     //ウィンドウを表示
  132.         ShowWindow(mainWindow);
  133.     //イベントループの開始
  134.         RunApplicationEventLoop();
  135.     //イベントハンドラを閉じる
  136.     DisposeEventHandlerUPP(myWinEvtHandler);
  137.     //3つのオフスクリーンを破棄する
  138.     DisposeGWorld(previewA_GWorld);
  139.     DisposeGWorld(previewB_GWorld);
  140.     DisposeGWorld(previewC_GWorld);
  141. }
  142.  
  143. //---------------------------------------------------------------------
  144. //
  145. //        ウィンドウのイベントハンドラー処理
  146. //
  147. //---------------------------------------------------------------------
  148. pascal OSStatus
  149. MyWindowEventHandler(EventHandlerCallRef myHandler, EventRef event, void* userData)
  150. {
  151. #pragma unused (myHandler, userData)
  152.     WindowRef        window;
  153.     OSStatus            result = eventNotHandledErr;
  154.     Rect                buttonBounds = { 341 , 234, 381, 404  };
  155.  
  156.     Point                    mousePt;
  157.     MouseTrackingResult        mouseRes;
  158.     UInt32                keyCode = 0;
  159.     
  160.     GetEventParameter(event, kEventParamDirectObject, typeWindowRef, NULL, sizeof(window), NULL, &window);
  161.  
  162.     switch(GetEventClass(event))
  163.     {
  164.     //ウィンドウイベント
  165.     case kEventClassWindow:
  166.         switch(GetEventKind(event))
  167.         {
  168.         case kEventWindowDrawContent:
  169.             HandleWindowUpdate(window);
  170.             result = noErr;
  171.             break;
  172.         case kEventWindowClose:
  173.             DisposeWindow(window);
  174.             QuitApplicationEventLoop();
  175.             result = noErr;
  176.             break;
  177.         }
  178.         break;
  179.     //マウスイベント
  180.     case kEventClassMouse:
  181.         switch(GetEventKind(event))
  182.         {
  183.         case kEventMouseDown:
  184.             TrackMouseLocation(GetWindowPort(mainWindow),&mousePt,&mouseRes);
  185.             if (PtInRect(mousePt,&buttonBounds) == true) {
  186.                 switchView = true;
  187.             }
  188.             break;
  189.         }
  190.         break;        
  191.     //キーボードイベント
  192.     case kEventClassKeyboard:
  193.         switch(GetEventKind(event))
  194.         {
  195.         case kEventRawKeyDown:
  196.             //キ ー コー ドを取 得
  197.             GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode);
  198.             //ス ペ ースキ ー が押 さ れたかど う かを判 断
  199.             if (keyCode == 49) {
  200.                 switchView = true;
  201.             }
  202.             break;
  203.         }
  204.         break;
  205.     }    
  206.     return result;
  207. }
  208.  
  209.  
  210. //---------------------------------------------------------------------
  211. //
  212. //        一定間隔ごとに呼び出されるタイマー処理
  213. //
  214. //---------------------------------------------------------------------
  215. pascal void MyTimerRoutine(EventLoopTimerRef loopTimerRef,void* userRef)
  216. {
  217. #pragma unused (loopTimerRef, userRef)
  218.  
  219.     if (switchView == true) {
  220.         if (timerFlip == false) {
  221.             MixImage(previewA_BaseAddr,previewA_RowBytes,
  222.                     previewB_BaseAddr,previewB_RowBytes,
  223.                     previewC_BaseAddr,previewC_RowBytes,
  224.                     VJPICT_SIZE_H,VJPICT_SIZE_V,mixLevel);
  225.             //次のスクロール表示位置を計算
  226.             mixLevel -= MIXSPEED;
  227.             //スクロールが左まで達したら、次のスクロール処理へ
  228.             if (mixLevel < 0) {
  229.                 timerFlip = true;
  230.                 switchView = false;
  231.                 mixLevel = 100;
  232.             }
  233.             //effectNoが0以外ならトーンエフェクト
  234.             if (effectNo != 0) DoEffects(previewC_BaseAddr,previewC_RowBytes,VJPICT_SIZE_H,VJPICT_SIZE_V,effectNo);
  235.         } else {
  236.             MixImage(previewA_BaseAddr,previewA_RowBytes,
  237.                     previewB_BaseAddr,previewB_RowBytes,
  238.                     previewC_BaseAddr,previewC_RowBytes,
  239.                     VJPICT_SIZE_H,VJPICT_SIZE_V,100 - mixLevel);
  240.             //次のスクロール表示位置を計算
  241.             mixLevel -= MIXSPEED;
  242.             //スクロールが左まで達したら、次のスクロール処理へ
  243.             if (mixLevel < 0) {
  244.                 timerFlip = false;
  245.                 switchView = false;
  246.                 mixLevel = 100;
  247.             }
  248.             //effectNoが0以外ならトーンエフェクト
  249.             if (effectNo != 0) DoEffects(previewC_BaseAddr,previewC_RowBytes,VJPICT_SIZE_H,VJPICT_SIZE_V,effectNo);
  250.         }
  251.     }
  252.     //オフスクリーンCをウィンドウに表示
  253.     CopyToWindow(previewC_GWorld,mainWindow);
  254. }
  255.  
  256. //---------------------------------------------------------------------
  257. //
  258. //        ウィンドウの更新
  259. //
  260. //---------------------------------------------------------------------
  261. void HandleWindowUpdate(WindowRef window)
  262. {
  263.     DrawBackground(window);
  264. }
  265.  
  266. //---------------------------------------------------------------------
  267. //
  268. //        メニューの組み込み
  269. //
  270. //---------------------------------------------------------------------
  271. OSStatus InstallStandardMenuBar(void)
  272. {
  273.     Handle        menuBar;
  274.     MenuRef         menu;
  275.     long             response;
  276.     OSStatus        err = noErr;
  277.  
  278.     menuBar = GetNewMBar(128);
  279.     if (menuBar)
  280.     {
  281.         SetMenuBar(menuBar);
  282.  
  283.         //MacOS X上ならFileメニューからQuitを取り除く
  284.         err = Gestalt(gestaltMenuMgrAttr, &response);
  285.         if ((err == noErr) && (response & gestaltMenuMgrAquaLayoutMask))
  286.         {
  287.             menu = GetMenuHandle(mFile);
  288.             DeleteMenuItem(menu, iQuit);
  289.         }
  290.  
  291.         DrawMenuBar();
  292.     }
  293.     return err;
  294. }
  295.  
  296. //---------------------------------------------------------------------
  297. //
  298. //        終了時のイベントハンドラー
  299. //
  300. //---------------------------------------------------------------------
  301. pascal OSErr QuitAppleEventHandler(const AppleEvent* appleEvt, AppleEvent* reply, long refcon)
  302. {
  303. #pragma unused (appleEvt, reply, refcon)
  304.         QuitApplicationEventLoop();
  305.     return noErr;
  306. }
  307.  
  308. //---------------------------------------------------------------------
  309. //
  310. //        アプリケーションイベントハンドラーの組み込み
  311. //
  312. //---------------------------------------------------------------------
  313. void InstallAppEvents(void)
  314. {
  315.     EventHandlerUPP    gAppCommandProcess;
  316.     EventTypeSpec        eventType;
  317.  
  318.     gAppCommandProcess = NewEventHandlerUPP(DoAppCommandProcess);
  319.     eventType.eventClass = kEventClassCommand;
  320.     eventType.eventKind = kEventCommandProcess;
  321.     InstallApplicationEventHandler(gAppCommandProcess, 1, &eventType, NULL, NULL);
  322. }
  323.  
  324.  
  325. //---------------------------------------------------------------------
  326. //
  327. //        アプリケーションイベントハンドラー
  328. //
  329. //---------------------------------------------------------------------
  330. pascal OSStatus DoAppCommandProcess(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData)
  331. {
  332. #pragma unused (nextHandler, userData)
  333.  
  334.     HICommand  aCommand;
  335.     OSStatus   result;
  336.  
  337.     GetEventParameter(theEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &aCommand);
  338.       
  339.     switch (aCommand.commandID)
  340.     {
  341.         case 'eff0':
  342.             effectNo = 0;
  343.             result = noErr; 
  344.             break;
  345.         case 'eff1':
  346.             effectNo = 1;
  347.             result = noErr; 
  348.             break;
  349.         case 'eff2':
  350.             effectNo = 2;
  351.             result = noErr; 
  352.             break;
  353.         case 'eff3':
  354.             effectNo = 3;
  355.             result = noErr; 
  356.             break;
  357.         case kHICommandQuit:
  358.             QuitApplicationEventLoop();
  359.             result = noErr;
  360.             break;
  361.         default:
  362.             result = eventNotHandledErr;
  363.             break;
  364.     }
  365.       HiliteMenu(0);
  366.       return result;
  367. }
  368.  
  369. //---------------------------------------------------------------------
  370. //
  371. //        画像データの読み込み
  372. //
  373. //---------------------------------------------------------------------
  374. void LoadPictures(void)
  375. {
  376.     //背景の読み込み
  377.     bgPictData = GetPicture ( BG_PICT_ID );
  378.     //プレビューAの読み込み
  379.     previewA_PicData = GetPicture ( PREVIEW_A );
  380.     //プレビューBの読み込み
  381.     previewB_PicData = GetPicture ( PREVIEW_B );
  382. }
  383.  
  384.  
  385. //---------------------------------------------------------------------
  386. //
  387. //        背景など固定部分の描画
  388. //
  389. //---------------------------------------------------------------------
  390. void DrawBackground(WindowRef window)
  391. {
  392.     GrafPtr        savePort;
  393.     CQDProcsPtr    saveProcs;
  394.     
  395.     //表示領域の指定    { 左上Y,左上X,右下Y,右下X }  (Y,X という順番に注意)
  396.     Rect                bgBounds = { 0, 0, SCREEN_SIZE_V, SCREEN_SIZE_H };
  397.     Rect                previewAbounds = { PREVIEW_A_PREVIEW_Y , PREVIEW_A_PREVIEW_X, 
  398.                                     PREVIEW_A_PREVIEW_Y + SIDE_PREVIEW_V, PREVIEW_A_PREVIEW_X + SIDE_PREVIEW_H  };
  399.     Rect                previewBbounds = { PREVIEW_B_PREVIEW_Y , PREVIEW_B_PREVIEW_X, 
  400.                                     PREVIEW_B_PREVIEW_Y + SIDE_PREVIEW_V, PREVIEW_B_PREVIEW_X + SIDE_PREVIEW_H  };
  401.  
  402.     //現在の描画対象情報を保存
  403.     GetPort(&savePort);
  404.     saveProcs = GetPortGrafProcs(savePort);
  405.  
  406.     //描画対象ポートをウィンドウに設定
  407.     SetPortWindowPort(window);
  408.     //ウィンドウに描画
  409.     DrawPicture (bgPictData,&bgBounds);
  410.     DrawPicture (previewA_PicData,&previewAbounds);
  411.     DrawPicture (previewB_PicData,&previewBbounds);
  412.  
  413.     //描画先の矩形領域を再設定
  414.     SetRect(&bgBounds,0,0,VJPICT_SIZE_H,VJPICT_SIZE_V);
  415.  
  416.     //描画対象ポートをオフスクリーンAに設定    
  417.     SetPort(previewA_GWorld);
  418.     //オフスクリーンAに描画
  419.     DrawPicture (previewA_PicData,&bgBounds);
  420.  
  421.     //描画対象ポートをオフスクリーンBに設定    
  422.     SetPort(previewB_GWorld);
  423.     //オフスクリーンBに描画
  424.     DrawPicture (previewB_PicData,&bgBounds);
  425.  
  426.     //現在の描画対象情報を復帰
  427.     SetPortGrafProcs(savePort, saveProcs);
  428. }
  429.  
  430.  
  431. //---------------------------------------------------------------------
  432. //
  433. //        オフクリーン(GWorld)の作成
  434. //
  435. //    引数:    sizeX    オフスクリーンの横サイズ
  436. //            sizeY    オフスクリーンの縦サイズ
  437. //
  438. //    戻り値:    作成したGWorldのGWorldPtr型データ
  439. //---------------------------------------------------------------------
  440. GWorldPtr CreateOffscreen(short sizeX,short sizeY)
  441. {
  442.     CGrafPtr        retPtr = nil;
  443.     Rect            screenSize;
  444.  
  445.     SetRect(&screenSize,0,0,sizeX,sizeY);
  446.     NewGWorld(&retPtr, 32, &screenSize, nil, nil, 0);
  447.     LockPixels(GetGWorldPixMap(retPtr));
  448.     return retPtr;
  449. }
  450.  
  451. //---------------------------------------------------------------------
  452. //
  453. //        指定したイメージデータをfillPixelで埋める
  454. //
  455. //    引数:    Ptr            ベースアドレス(ポインタ)
  456. //            long            ローバイト
  457. //            short        イメージのサイズ横幅
  458. //            short        イメージのサイズ縦幅
  459. //            unsigned long    埋めるピクセルデータ
  460. //
  461. //    戻り値:    なし
  462. //---------------------------------------------------------------------
  463. void FillImage(Ptr baseAddress,long rowBytes,short imageSizeX,short imageSizeY,unsigned long fillPixel)
  464. {
  465.     Ptr        writingAddress;        //ピクセルデータを書き込み中のポインタ
  466.     short    loopX,loopY;            //forループ用
  467.  
  468.     //下方向へのループを設定
  469.     for (loopY = 0 ; loopY != imageSizeY ; loopY++) {
  470.         //各ラインの始点を指すポインタを取得し設定
  471.         writingAddress = baseAddress + rowBytes * loopY;
  472.  
  473.         //右方向に1ライン分のループを設定
  474.         for (loopX = 0 ; loopX != imageSizeX ; loopX++) {
  475.             //ポインタを4バイト(unsigned long型)ずつ進めながら書き込んでいく
  476.             *((unsigned long*)writingAddress)++ = fillPixel;
  477.         }
  478.     }
  479. }
  480.  
  481.  
  482.  
  483. //---------------------------------------------------------------------
  484. //
  485. //        指定したGWorldの内容をウィンドウ(中央プレビュー部)に描画
  486. //
  487. //    引数:    GWorldPtr        転送元オフスクリーン
  488. //            WindowRef    転送先ウィンドウ(表示座標はプレビューC部分)
  489. //    戻り値:    なし
  490. //---------------------------------------------------------------------
  491. void CopyToWindow(GWorldPtr srcGWorld,WindowRef dstWindow)
  492. {
  493.     GrafPtr        savePort;
  494.     CQDProcsPtr    saveProcs;
  495.     Rect        srcRect,dstRect;
  496.     
  497.     //現在の描画対象情報を保存
  498.     GetPort(&savePort);
  499.     saveProcs = GetPortGrafProcs(savePort);
  500.  
  501.     //転送元のRectを設定
  502.     SetRect(&srcRect,0,0,VJPICT_SIZE_H,VJPICT_SIZE_V);
  503.     //転送先(ウィンドウ上の表示位置)のRectを設定
  504.     SetRect(&dstRect,PREVIEW_C_PREVIEW_X,PREVIEW_C_PREVIEW_Y,
  505.             PREVIEW_C_PREVIEW_X + CENTER_PREVIEW_H,PREVIEW_C_PREVIEW_Y + CENTER_PREVIEW_V);
  506.     
  507.     //描画対象ポートの設定
  508.     SetPortWindowPort(dstWindow);
  509.     //指定したオフスクリーンの指定範囲をウィンドウに転送して表示
  510.     CopyBits(GetPortBitMapForCopyBits(srcGWorld), GetPortBitMapForCopyBits(GetWindowPort(dstWindow)),&srcRect,&dstRect,srcCopy,nil);
  511.  
  512.     //現在の描画対象情報を復帰
  513.     SetPortGrafProcs(savePort, saveProcs);
  514. }
  515.  
  516.  
  517.  
  518. //---------------------------------------------------------------------
  519. //
  520. //        指定した2つのイメージデータをコピー
  521. //
  522. //    引数:    Ptr        srcBaseAddress    転送元ベースアドレス(ポインタ)
  523. //            long        srcRowBytes        転送元ローバイト
  524. //            Ptr        dstBaseAddress    転送先ベースアドレス(ポインタ)
  525. //            long        dstRowBytes        転送先ローバイト
  526. //            short    imageSizeX        イメージのサイズ横幅
  527. //            short    imageSizeY        イメージのサイズ縦幅
  528. //
  529. //    戻り値:    なし
  530. //---------------------------------------------------------------------
  531. void CopyImage(Ptr srcBaseAddress,long srcRowBytes,Ptr dstBaseAddress,long dstRowBytes,short imageSizeX,short imageSizeY)
  532. {
  533.     Ptr        readAddress;            //ピクセルデータを読み込み中のポインタ(転送元)
  534.     Ptr        writingAddress;        //ピクセルデータを書き込み中のポインタ(転送先)
  535.     short    loopX,loopY;            //forループ用
  536.  
  537.     //下方向へのループを設定
  538.     for (loopY = 0 ; loopY != imageSizeY ; loopY++) {
  539.         //各ラインの始点を指すポインタを取得し設定
  540.         readAddress = srcBaseAddress + srcRowBytes * loopY;
  541.         writingAddress = dstBaseAddress + dstRowBytes * loopY;
  542.  
  543.         //右方向に1ライン分のループを設定
  544.         for (loopX = 0 ; loopX != imageSizeX ; loopX++) {
  545.             //ポインタを4バイト(unsigned long型)ずつ進めながら書き込んでいく
  546.             *((unsigned long*)writingAddress)++ = *((unsigned long*)readAddress)++;
  547.         }
  548.     }
  549. }
  550.  
  551. //---------------------------------------------------------------------
  552. //
  553. //        イメージデータを指 定し たX座標からコピー
  554. //
  555. //    引数:    Ptr        srcBaseAddress    転送元ベースアドレス(ポインタ)
  556. //            long        srcRowBytes        転送元ローバイト
  557. //            Ptr        dstBaseAddress    転送先ベースアドレス(ポインタ)
  558. //            long        dstRowBytes        転送先ローバイト
  559. //            short    imageSizeX        イメージのサイズ横幅
  560. //            short    imageSizeY        イメージのサイズ縦幅
  561. //            short    offsetX            転 送先を張 り 付け るX座 標
  562. //
  563. //    戻り値:    なし
  564. //---------------------------------------------------------------------
  565. void RollImage(Ptr srcBaseAddress,long srcRowBytes,Ptr dstBaseAddress,long dstRowBytes,short imageSizeX,short imageSizeY,short offsetX)
  566. {
  567.     Ptr        readAddress;            //ピクセルデータを読み込み中のポインタ(転送元)
  568.     Ptr        writingAddress;        //ピクセルデータを書き込み中のポインタ(転送先)
  569.     short    loopX,loopY;            //forループ用
  570.  
  571.     //下方向へのループを設定
  572.     for (loopY = 0 ; loopY != imageSizeY ; loopY++) {
  573.         //各ラインの始点を指すポインタを取得し設定
  574.         readAddress = srcBaseAddress + srcRowBytes * loopY;
  575.         writingAddress = dstBaseAddress + dstRowBytes * loopY
  576.                      + offsetX * sizeof(unsigned long);
  577.  
  578.         //右方向に1ライン分のループを設定
  579.         for (loopX = 0 ; loopX != imageSizeX - offsetX ; loopX++) {
  580.             //ポインタか ら4バイト(unsigned long型)ずつ書き込んでいく
  581.             *((unsigned long*)writingAddress)++ = *((unsigned long*)readAddress)++;
  582.         }
  583.     }
  584. }
  585.  
  586. //---------------------------------------------------------------------
  587. //
  588. //        2つのイメージデータを指定した度合いで合成
  589. //
  590. //    引数:    Ptr        srcBaseAddress1    転送元ベースアドレス1(ポインタ)
  591. //            long        srcRowBytes1        転送元ローバイト1
  592. //            Ptr        srcBaseAddress2    転送元ベースアドレス2(ポインタ)
  593. //            long        srcRowBytes2        転送元ローバイト2
  594. //            Ptr        dstBaseAddress    転送先ベースアドレス(ポインタ)
  595. //            long        dstRowBytes        転送先ローバイト
  596. //            short    imageSizeX        イメージのサイズ横幅
  597. //            short    imageSizeY        イメージのサイズ縦幅
  598. //            short    fadeLevel            転送元1の合成の割合(0〜100%)
  599. //
  600. //    戻り値:    なし
  601. //---------------------------------------------------------------------
  602. void MixImage(Ptr srcBaseAddress1,long srcRowBytes1,
  603.             Ptr srcBaseAddress2,long srcRowBytes2,
  604.             Ptr dstBaseAddress,long dstRowBytes,
  605.             short imageSizeX,short imageSizeY,short fadeLevel)
  606. {
  607.     Ptr            readAddress1;            //ピクセルデータを読み込み中のポインタ(転送元1)
  608.     Ptr            readAddress2;            //ピクセルデータを読み込み中のポインタ(転送元2)
  609.     Ptr            writingAddress;        //ピクセルデータを書き込み中のポインタ(転送先)
  610.     short        loopX,loopY;            //forループ用
  611.  
  612.     //転送元1か ら読 み 込ん だピ ク セル情 報
  613.     unsigned long    readPixel1;
  614.     unsigned long    red1;
  615.     unsigned long    green1;
  616.     unsigned long    blue1;
  617.  
  618.     //転送元2から読み込んだピクセル情報
  619.     unsigned long    readPixel2;
  620.     unsigned long    red2;
  621.     unsigned long    green2;
  622.     unsigned long    blue2;
  623.  
  624.     //合成結果を書き込むための演算結果
  625.     unsigned long    writePixel;
  626.     unsigned long    red3;
  627.     unsigned long    green3;
  628.     unsigned long    blue3;
  629.  
  630.     //下方向へのループを設定
  631.     for (loopY = 0 ; loopY != imageSizeY ; loopY++) {
  632.         //各ラインの始点を指すポインタを取得し設定
  633.         readAddress1 = srcBaseAddress1 + srcRowBytes1 * loopY;
  634.         readAddress2 = srcBaseAddress2 + srcRowBytes2 * loopY;
  635.         writingAddress = dstBaseAddress + dstRowBytes * loopY;
  636.  
  637.         //右方向に1ライン分のループを設定
  638.         for (loopX = 0 ; loopX != imageSizeX ; loopX++) {
  639.             //転送元1ポインタか ら4バイト(unsigned long型)ずつ読 み 込む
  640.             readPixel1 = *((unsigned long*)readAddress1)++;
  641.             //RGBそ れ ぞれ のレ ベ ルを抽 出
  642.             blue1 = readPixel1 & 0x000000ff;
  643.             readPixel1 = readPixel1 >> 8;
  644.             green1 = readPixel1 & 0x000000ff;
  645.             readPixel1 = readPixel1 >> 8;
  646.             red1 = readPixel1 & 0x000000ff;
  647.             //転送元2ポインタか ら4バイト(unsigned long型)ずつ読 み 込む
  648.             readPixel2 = *((unsigned long*)readAddress2)++;
  649.             //RGBそれぞれのレベルを抽出
  650.             blue2 = readPixel2 & 0x000000ff;
  651.             readPixel2 = readPixel2 >> 8;
  652.             green2 = readPixel2 & 0x000000ff;
  653.             readPixel2 = readPixel2 >> 8;
  654.             red2 = readPixel2 & 0x000000ff;
  655.             //各色の合成演算を行う(転送元1が(fadeLevel)%、転送元2が(100-fadeLevel)%)
  656.             red3 = red1 * fadeLevel / 100 + red2 * (100 - fadeLevel) / 100;
  657.             green3 = green1 * fadeLevel / 100 + green2 * (100 - fadeLevel) / 100;
  658.             blue3 =blue1 * fadeLevel / 100 + blue2 * (100 - fadeLevel) / 100;
  659.             //各色をunsigned long型のピクセルデータに戻す
  660.             writePixel = red3;
  661.             writePixel = writePixel << 8;
  662.             writePixel = writePixel | green3;
  663.             writePixel = writePixel << 8;
  664.             writePixel = writePixel | blue3;
  665.             //ピクセルデータを書き込む
  666.             *((unsigned long*)writingAddress)++ = writePixel;
  667.         }
  668.     }
  669.  
  670. }
  671.  
  672.  
  673. //---------------------------------------------------------------------
  674. //
  675. //        指定したGWorldの内容に対して指定したトーンエフェクト
  676. //
  677. //    引数:    Ptr        dstBaseAddress    転送先ベースアドレス(ポインタ)
  678. //            long        dstRowBytes        転送先ローバイト
  679. //            short    imageSizeX        イメージのサイズ横幅
  680. //            short    imageSizeY        イメージのサイズ縦幅
  681. //            short        エフェクトの種類(0=なし)
  682. //    戻り値:    なし
  683. //---------------------------------------------------------------------
  684. void DoEffects(Ptr theBaseAddress,long theRowBytes,short imageSizeX,short imageSizeY,short effectNo)
  685. {
  686.     Ptr            readWriteAddress;        //ピクセルデータの読み書き用のポインタ
  687.     short        loopX,loopY;            //forループ用
  688.  
  689.     //読み込んだピクセル情報
  690.     unsigned long    readWritePixel;
  691.     unsigned long    red;
  692.     unsigned long    green;
  693.     unsigned long    blue;
  694.     unsigned long    yValue;
  695.  
  696.     //下方向へのループを設定
  697.     for (loopY = 0 ; loopY != imageSizeY ; loopY++) {
  698.         //各ラインの始点を指すポインタを取得し設定
  699.         readWriteAddress = theBaseAddress + theRowBytes * loopY;
  700.  
  701.         //右方向に1ライン分のループを設定
  702.         for (loopX = 0 ; loopX != imageSizeX ; loopX++) {
  703.             //転送元1ポインタか ら4バイト(unsigned long型)ずつ読 み 込む
  704.             readWritePixel = *((unsigned long*)readWriteAddress);
  705.             //RGBそ れ ぞれ のレ ベ ルを抽 出
  706.             blue = readWritePixel & 0x000000ff;
  707.             readWritePixel = readWritePixel >> 8;
  708.             green = readWritePixel & 0x000000ff;
  709.             readWritePixel = readWritePixel >> 8;
  710.             red = readWritePixel & 0x000000ff;
  711.  
  712.             switch (effectNo)
  713.             {
  714.             //モノクロ
  715.             case 1:
  716.                 yValue = (red * 3 / 10)  + (green * 6 / 10) + (blue * 1 / 10); 
  717.                 red = yValue;
  718.                 green = yValue;
  719.                 blue = yValue;
  720.                 break;
  721.             //セピア
  722.             case 2:
  723.                 yValue = (red * 3 / 10)  + (green * 6 / 10) + (blue * 1 / 10); 
  724.                 red = yValue * 240 / 255;
  725.                 green = yValue * 200 / 255;
  726.                 blue = yValue * 145 / 255;
  727.                 break;
  728.             //ネガポジ
  729.             case 3:
  730.                 red = 255 - red;
  731.                 green = 255 - green;
  732.                 blue = 255 - blue;
  733.                 break;
  734.             }
  735.  
  736.             //各色をunsigned long型のピクセルデータに戻す
  737.             readWritePixel = red;
  738.             readWritePixel = readWritePixel << 8;
  739.             readWritePixel = readWritePixel | green;
  740.             readWritePixel = readWritePixel << 8;
  741.             readWritePixel = readWritePixel | blue;
  742.             //ピクセルデータを書き込む
  743.             *((unsigned long*)readWriteAddress)++ = readWritePixel;
  744.         }
  745.     }
  746. }
  747.